﻿using System.Collections.Generic;
using System.Linq;
using Business_Layer.Data_Access_Layer;
using System;

namespace Business_Layer.Business_Layer.Requerimientos
{
    public class ControladorRequerimientos
    {
        private readonly DB_SAPDataContext _dbSap = new DB_SAPDataContext();

        private IEnumerable<REQUERIMIENTOS> ObtenerRequerimientosPorProyecto(string proyecto)
        {
            return _dbSap.REQUERIMIENTOS.Where(x => x.PROYECTOS_REQUERIMIENTOS.FirstOrDefault().PROYECTOS.PROYECTOS_nombre.Equals(proyecto)).ToList();
        } 

        private IEnumerable<PROYECTOS> ObtenerProyectos()
        {
            return _dbSap.PROYECTOS.Select(x => x).ToList();
        } 

        public string CrearContenidoRequerimientos(string proyecto)
        {
            var renderRequerimientos = ObtenerRequerimientosPorProyecto(proyecto)
                .Aggregate(string.Empty, (current, requerimiento) => current + (
                                                                                "<tr>" +
                                                                                "<td>" +
                                                                                requerimiento.REQUERIMIENTOS_clave +
                                                                                "</td>" +
                                                                                "<td>" +
                                                                                requerimiento.REQUERIMIENTOS_descripcion +
                                                                                "</td>" +
                                                                                "<td>" +
                                                                                requerimiento.REQUERIMIENTOS_prioridad +
                                                                                "</td>" +
                                                                                "<td>" +
                                                                                "<span id='btnEditarRequerimiento" +
                                                                                "' data-id='" +
                                                                                requerimiento.REQUERIMIENTOS_ID +
                                                                                "' data-descripcion='" +
                                                                                requerimiento.REQUERIMIENTOS_descripcion +
                                                                                "' data-prioridad='" +
                                                                                requerimiento.REQUERIMIENTOS_prioridad +
                                                                                "'>" +
                                                                                "<img src='/Misc/imagenes/edit_icon_24.png' />" +
                                                                                "</span>" +
                                                                                "<span id='btnEliminarRequerimiento' data-id='" +
                                                                                requerimiento.REQUERIMIENTOS_ID + "'>" +
                                                                                "<img src='/Misc/imagenes/cancel.png' />" +
                                                                                "</span></td>" +
                                                                                "</tr>"));

            return
                "<table id='tblRequerimientos''>" +
                "<tr>" +
                "<th>Clave</th>" +
                "<th>Descripción</th>" +
                "<th>Prioridad</th>" +
                "<th></th>" +
                "</tr>" +
                renderRequerimientos +
                "</table>";
        }

        public string CrearDialogoAgregarRequerimiento()
        {
            var dialogo =
            "<table>" +
            "<tr>" +
            "<td>Proyecto: </td>" +
            "<td>" + CargarProyectos("selectProyectosDialogo") + "</td>" +
            "</tr>" +
            "<tr>" +
            "<td>Descripción: </td><td><input type='text' id='txtDescripcion' maxlength='50' /></td>" +
            "</tr>" +
            "<tr>" +
            "<td>Prioridad: </td>" +
           "<td>" +
            "<input type='text' id='txtPrioridad' maxlength='3' />" +
            "</td>" +
            "</tr>" +
            "</table>";

            return dialogo;
        }

        private bool ValidarNombreRequerimiento(string nombre)
        {
            return
                _dbSap.REQUERIMIENTOS.Any(x => x.REQUERIMIENTOS_descripcion.Equals(nombre));
        }

        private bool ValidarNombreRequerimiento(string nombre, int id)
        {
            return
                _dbSap.REQUERIMIENTOS.Any(x => x.REQUERIMIENTOS_descripcion.Equals(nombre) && x.REQUERIMIENTOS_ID != id);
        }

        public string RegistrarRequerimiento(REQUERIMIENTOS requerimiento, string proyecto)
        {
            try
            {
                if (ValidarNombreRequerimiento(requerimiento.REQUERIMIENTOS_descripcion))
                    return "Nombre de requerimiento actualmente en uso, favor de especificar uno distinto";

                var prioridad =
                    _dbSap.REQUERIMIENTOS.Any(
                        x =>
                        x.PROYECTOS_REQUERIMIENTOS.FirstOrDefault().PROYECTOS.PROYECTOS_nombre.Equals(proyecto) &&
                        x.REQUERIMIENTOS_prioridad == requerimiento.REQUERIMIENTOS_prioridad);

                if (prioridad)
                    return "Especifique un valor de prioridad distinto";

                var proyectoId = _dbSap.PROYECTOS.Single(x => x.PROYECTOS_nombre.Equals(proyecto)).PROYECTOS_ID;

                requerimiento.REQUERIMIENTOS_clave = ObtenerUltimoValorClave(proyecto);
                _dbSap.REQUERIMIENTOS.InsertOnSubmit(requerimiento);
                _dbSap.SubmitChanges();

                var proyectosRequerimientos = new PROYECTOS_REQUERIMIENTOS
                    {
                        REQUERIMIENTO_ID = requerimiento.REQUERIMIENTOS_ID,
                        PROYECTO_ID = proyectoId
                    };

                _dbSap.PROYECTOS_REQUERIMIENTOS.InsertOnSubmit(proyectosRequerimientos);
                _dbSap.SubmitChanges();

                return "Requerimiento registrado";
            }
            catch
            {
                return "Requerimiento no registrado";
            }
        }

        public string CargarProyectos(string id)
        {
            var listaProyectos = ObtenerProyectos()
                .Aggregate(string.Empty,
                           (current, proyecto) =>
                           current + ("<option>" + proyecto.PROYECTOS_nombre +
                                      "</option>"));

            return "<select id='" + id + "'>" + listaProyectos + "</select>";
        }

        public string ModificarRequerimiento(REQUERIMIENTOS requerimiento, string proyecto)
        {
            try
            {
                if (ValidarNombreRequerimiento(requerimiento.REQUERIMIENTOS_descripcion, requerimiento.REQUERIMIENTOS_ID))
                    return "Nombre de requerimiento actualmente en uso, favor de especificar uno distinto";

                var prioridad =
                    _dbSap.REQUERIMIENTOS.Any(
                        x =>
                        x.PROYECTOS_REQUERIMIENTOS.FirstOrDefault().PROYECTOS.PROYECTOS_nombre.Equals(proyecto) &&
                        x.PROYECTOS_REQUERIMIENTOS.FirstOrDefault().REQUERIMIENTO_ID != requerimiento.REQUERIMIENTOS_ID &&
                        x.REQUERIMIENTOS_prioridad == requerimiento.REQUERIMIENTOS_prioridad);

                if (prioridad)
                    return "Especifique un valor de prioridad distinto";

                var requerimientoModificar = _dbSap.REQUERIMIENTOS.FirstOrDefault(x => x.REQUERIMIENTOS_ID == requerimiento.REQUERIMIENTOS_ID);

                if (requerimientoModificar != null)
                {
                    requerimientoModificar.REQUERIMIENTOS_descripcion = requerimiento.REQUERIMIENTOS_descripcion;
                    requerimientoModificar.REQUERIMIENTOS_prioridad = requerimiento.REQUERIMIENTOS_prioridad;

                    _dbSap.SubmitChanges();
                    return "Requerimiento editado";
                }

                return "Requerimiento no editado";
            }
            catch
            {
                return "Requerimiento no editado";
            }
        }

        public string EliminarRequerimiento(int id)
        {
            try
            {
                var requerimiento = _dbSap.REQUERIMIENTOS.Single(x => x.REQUERIMIENTOS_ID == id);
                var requerimientoPr = _dbSap.PROYECTOS_REQUERIMIENTOS.Single(x => x.REQUERIMIENTO_ID == id);
                _dbSap.PROYECTOS_REQUERIMIENTOS.DeleteOnSubmit(requerimientoPr);
                _dbSap.REQUERIMIENTOS.DeleteOnSubmit(requerimiento);
                _dbSap.SubmitChanges();

                return "Requerimiento eliminado";
            }
            catch
            {
                return "Requerimiento no eliminado";
            }
        }

        public string ObtenerUltimoValorClave(string proyecto)
        {
            try
            {
                var claves =
                    _dbSap.REQUERIMIENTOS.Where(
                        x => x.PROYECTOS_REQUERIMIENTOS.FirstOrDefault().PROYECTOS.PROYECTOS_nombre.Equals(proyecto))
                          .Select(x => x.REQUERIMIENTOS_clave).ToList();

                var clave = claves.Select(valor => Convert.ToInt32(valor.Remove(0, 3))).ToList().Max();

                if (clave != 0)
                    return "req" + (clave + 1);

                return "req" + 1;
            }
            catch
            {
                return "req" + 1;
            }
        }
    }
}
